package dao;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 * Verwaltet die Datenbankverbindung.
 * 
 * 
 */
public class SqlConnection {

	private static SqlConnection meineInstanz = null;

	private Connection con = null;
	private Statement stmt;
	private String url = "";

	/**
	 * Privater Konstruktor => Singelton, es soll immer nur EINE Connection
	 * existieren.
	 * 
	 * @throws IOException
	 */
	private SqlConnection() {

		try {
			Class.forName("com.mysql.jdbc.Driver"); // treiber
			this.url = "jdbc:mysql://localhost/fiad_db";
			this.con = DriverManager.getConnection(this.url, "root", "");

			this.stmt = this.con.createStatement();

		} catch (ClassNotFoundException e) {
			System.out.println("Verbindung zum Server ist fehlgeschlagen. "
					+ " Verbindung zu :" + this.url);

			e.printStackTrace();

		} catch (SQLException e) {
			System.out.println("Verbindung zum Server ist fehlgeschlagen. "
					+ " Verbindung zu :" + this.url);
		}
	}

	/**
	 * Factory-Methode. Singelton. Liefert das einzige Objekt dieser Klasse.
	 * 
	 * @return
	 */
	public static SqlConnection getInstance() {

		if (meineInstanz == null) {
			meineInstanz = new SqlConnection();
		}
		return meineInstanz;
	}

	/**
	 * F�hrt einen SQL-Select Befehl aus.
	 * 
	 * @param sql
	 *            Auszuf�hrender SQL-Befehl .
	 * @return Ergebnisse des SQL-Befehls als Resultset
	 * @throws IOException
	 */
	public ResultSet sqlSelectAusfuehren(String sql) {
		ResultSet rs = null;

		try {

			rs = this.stmt.executeQuery(sql);
		} catch (SQLException e) {
			System.out
					.println("Fehler beim Ausfuehren des SQL-Befehls: " + sql);

			JOptionPane.showInternalMessageDialog(null, "TEST");
		}
		return rs;

	}

	/**
	 * Fuehrt einen SQL Befehl aus.
	 * 
	 * @param sql
	 *            Auszufuehrender SQL-Befehl .
	 * @throws IOException
	 */
	public void sqlAusfuehren(String sql) {

		try {

			this.stmt.executeUpdate(sql);
		} catch (SQLException e) {
			System.out.println("Fehler beim Ausführen des SQL-Befehls: " + sql);
		}

	}

	/**
	 * Schliessen der Connection.
	 * 
	 * @throws IOException
	 */
	public void closeConnection() {

		try {
			this.con.close();
		} catch (SQLException e) {
			System.out.println("Verbindung zum Server ist fehlgeschlagen. "
					+ " Verbindung zu :" + this.url);
		}

	}

	/**
	 * Liefert ein Statement.
	 * 
	 * @return Statement
	 */
	public Statement getStatement() {
		return this.stmt;
	}
}